home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / sox / sbdsp.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  156 lines

  1.  
  2. char ansi_c_is_very_stupid_and_needs_a_variable_here;
  3.  
  4. #if    defined(BLASTER) || defined(SBLAST)
  5. /*
  6.  * Copyright 1992 Rick Richardson
  7.  * Copyright 1991 Lance Norskog And Sundry Contributors
  8.  * This source code is freely redistributable and may be used for
  9.  * any purpose.  This copyright notice must be maintained. 
  10.  * Rick Richardson, Lance Norskog And Sundry Contributors are not
  11.  * responsible for the consequences of using this software.
  12.  */
  13.  
  14. /*
  15.  * Direct to Sound Blaster device driver.
  16.  * SBLAST patches by John T. Kohl.
  17.  */
  18.  
  19. #include <sys/types.h>
  20. #ifdef SBLAST
  21. #include <i386/isa/sblast.h>
  22. #else
  23. #include <sys/sb.h>
  24. #endif
  25. #include <signal.h>
  26. #include "st.h"
  27.  
  28. /* Private data for SKEL file */
  29. typedef struct sbdspstuff {
  30.     int    samples;        /* bytes remaining in current block */
  31. } *sbdsp_t;
  32.  
  33. IMPORT float volume, amplitude;
  34. IMPORT int summary, verbose;
  35.  
  36. static got_int = 0;
  37.  
  38. static void
  39. sigint(s)
  40. {
  41.     if (s) got_int = 1;
  42.     else signal(SIGINT, sigint);
  43. }
  44.  
  45. /*
  46.  * Do anything required before you start reading samples.
  47.  * Read file header. 
  48.  *    Find out sampling rate, 
  49.  *    size and style of samples, 
  50.  *    mono/stereo/quad.
  51.  */
  52. sbdspstartread(ft) 
  53. ft_t ft;
  54. {
  55.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  56.     int off = 0;
  57.  
  58.     /* If you need to seek around the input file. */
  59.     if (0 && ! ft->seekable)
  60.         fail("SKEL input file must be a file, not a pipe");
  61.  
  62.     if (!ft->info.rate)
  63.         ft->info.rate = 11000;
  64.     ft->info.size = BYTE;
  65.     ft->info.style = UNSIGNED;
  66.     ft->info.channels = 1;
  67.     ioctl(fileno(ft->fp), DSP_IOCTL_RESET, 0);
  68. #ifdef SBLAST
  69.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, &off);
  70.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, &ft->info.rate);
  71. #else
  72.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, 0);
  73.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, ft->info.rate);
  74. #endif
  75.     sigint(0);    /* Prepare to catch SIGINT */
  76. }
  77.  
  78. /*
  79.  * Read up to len samples from file.
  80.  * Convert to signed longs.
  81.  * Place in buf[].
  82.  * Return number of samples read.
  83.  */
  84.  
  85. sbdspread(ft, buf, len) 
  86. ft_t ft;
  87. long *buf, len;
  88. {
  89.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  90.     int        rc;
  91.  
  92.     if (got_int) return (0);
  93.     rc = rawread(ft, buf, len);
  94.     if (rc < 0) return 0;
  95.     return (rc);
  96. }
  97.  
  98. /*
  99.  * Do anything required when you stop reading samples.  
  100.  * Don't close input file! 
  101.  */
  102. sbdspstopread(ft) 
  103. ft_t ft;
  104. {
  105. #ifdef SBLAST
  106.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  107. #endif
  108. }
  109.  
  110. sbdspstartwrite(ft) 
  111. ft_t ft;
  112. {
  113.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  114.     int on = 1;
  115.  
  116.     /* If you have to seek around the output file */
  117.     if (0 && ! ft->seekable)
  118.         fail("Output .sbdsp file must be a file, not a pipe");
  119.  
  120.     if (!ft->info.rate)
  121.         ft->info.rate = 11000;
  122.     ft->info.size = BYTE;
  123.     ft->info.style = UNSIGNED;
  124.     ft->info.channels = 1;
  125.     ioctl(fileno(ft->fp), DSP_IOCTL_RESET, 0);
  126. #ifdef SBLAST
  127.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  128.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, &on);
  129.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, &ft->info.rate);
  130. #else
  131.     ioctl(fileno(ft->fp), DSP_IOCTL_VOICE, 1);
  132.     ioctl(fileno(ft->fp), DSP_IOCTL_SPEED, ft->info.rate);
  133. #endif
  134. }
  135.  
  136. sbdspwrite(ft, buf, len) 
  137. ft_t ft;
  138. long *buf, len;
  139. {
  140.     sbdsp_t sbdsp = (sbdsp_t) ft->priv;
  141.  
  142.     if (len == 0) return 0;
  143.     return (rawwrite(ft, buf, len));
  144. }
  145.  
  146. sbdspstopwrite(ft) 
  147. ft_t ft;
  148. {
  149.     /* All samples are already written out. */
  150.     /* If file header needs fixing up, for example it needs the */
  151.      /* the number of samples in a field, seek back and write them here. */
  152.     fflush(ft->fp);
  153.     ioctl(fileno(ft->fp), DSP_IOCTL_FLUSH, 0);
  154. }
  155. #endif
  156.